/**
instanceof :方便检查对象的类型。
作用：	解决class cast exception 异常
		通过boolean 去确认子类和父类是不是同一个链条的。   (多个链条继承父类的情况)
		注意属性的问题 属性是对象的  不是引用的类型
语法格式如下：
对象instanceof 类型   --返回boolean类型值

示例

 if(对象 instanceof 类型){
 	//...
 }
 
1.父类通常情况下设计为抽象类或者接口，优先考虑接口
2.具体类不要去继承另一个具体类 ，好处无需检查 是否是多态 父类的引用指向子类的对象
 */


/*
package com.leo.第五章_面向对象下;

public class U5_L11_instanceof关键字 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Baseclass sub=new Subclass2_2();
		//Baseclass sub2=new Subclass2();
		//Baseclass sub3=new Subclass2_2();
		type_change(sub);
		
	}
	
	public static void type_change(Baseclass c) {
		//sub的类型在if的代码块里面改成了 subclass  但是出了这个代码块 类型还是父类的
		//通过这个代码块可以使用sub 里面的go方法。
		if(c instanceof Baseclass) {
			Subclass2 sub=(Subclass2)c;
			System.out.println(sub.name);
			//这个sub 现在类型是改成 subclass2 但是属性是 subclass 2_2  因为对象是subclass2_2
			sub.go2();
		}else {
			System.out.println("不是子类对象，不需要切换");
		}
		
	}
}

abstract class Baseclass{
	protected String name;
	public Baseclass() {
		this.name="Baseclass";
		System.out.println("调用0的无参！");
	}
	abstract public void eat();
}

class Subclass extends Baseclass{
	public Subclass() {
		System.out.println("调用1的无参！");
		this.name="sub";
	}
	public void eat() {
	
		System.out.println(name+"吃饭");
	}
	public void go() {
		 
		System.out.println(name+"走");
	}
}

class Subclass2 extends Baseclass{
	
	public Subclass2() {
		System.out.println("调用2的无参！");
		this.name="sub2";
	}
	public void eat() {
		
		System.out.println(name+"吃饭");
	}
public void go2() {
		
		System.out.println(name+"走2");
	}
}

class Subclass2_2 extends Subclass2{
	public Subclass2_2() {
		
		System.out.println("调用2_2的无参！");
		this.name="sub2_2";
	}
	public void eat() {
		
		System.out.println(name+"吃饭");
	}
	public void go2_2() {
		
		System.out.println(this.name+"走2_2");
	}
}
*/


